package com.mrx.commons.service;

import com.mrx.commons.exception.BusinessException;
import org.springframework.lang.Nullable;

/**
 * @author Mr.X
 * @since 2023-02-12 19:31
 */
public interface IRateLimiterService {

    long SUCCEED_LOCKED = -1L;

    /**
     * 尝试获取 锁
     *
     * @param key     锁的 key
     * @param timeout 锁 超时时间
     * @return 还剩多少时间释放锁, 如果成功上锁, 那就返回 -1, 否则返回 锁 的超时时间
     */
    long tryAcquire(String key, @Nullable Integer timeout);

    void tryAcquire(String ip) throws BusinessException;

}
